/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package stud.cp.core.security;

import javax.ejb.Stateless;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.apache.log4j.Logger;

import stud.cp.core.dbaccess.DAOException;
import stud.cp.core.plugins.PluginConst;
import stud.cp.core.plugins.PluginRouter;
import stud.cp.core.plugins.WrongPageRequest;
import stud.cp.user.dbaccess.OracleDAOFactory;
import stud.cp.user.valueobjects.User;

/**
 * Р‘РёРЅ - РїР»Р°РіРёРЅ, РѕС‚РІРµС‡Р°СЋС‰РёР№ Р·Р° Р°РІС‚РѕСЂРёР·Р°С†РёСЋ РїРѕР»СЊР·РѕРІР°С‚РµР»СЏ.
 * @author Morfant
 */
@Stateless
public class AuthorizationPluginBean implements AuthorizationPluginLocal {

    /**
     * Р¤Р°Р±СЂРёРєР° DAO РєР»Р°СЃСЃРѕРІ.
     */
    private OracleDAOFactory oracleDAOFactory = null;
    /**
     * Р›РѕРіРіРµСЂ.
     */
    private static Logger logger = Logger.getLogger("ACPII");

    /**
     * РњРµС‚РѕРґ, СЂРµР°Р»РёР·СѓСЋС‰РёР№ РѕСЃРЅРѕРІРЅСѓСЋ Р±РёР·РЅРµСЃР»РѕРіРёРєСѓ.
     * @param req Р РµРєРІРµСЃС‚.
     * @return РљР»Р°СЃСЃ СЂРѕСѓС‚РµСЂ.
     */
    @Override
    public PluginRouter perform(HttpServletRequest req) {
        String subaction = req.getParameter(PluginConst.SUBACTION);
        if ((subaction != null) && (!subaction.equals(""))) {
            try {
                oracleDAOFactory = new OracleDAOFactory();
                oracleDAOFactory.initialize();

                /**
                 * Р—Р°РїСЂРѕСЃ СЃС‚СЂР°РЅРёС†С‹ Р°РІС‚РѕСЂРёР·Р°С†РёРё.
                 */
                if (subaction.equals(PluginConst.GET_AUTHORIZATION_PAGE)) {
                    return getAuthrizationPage(req);
                }

                /**
                 * РђРІС‚РѕСЂРёР·Р°С†РёСЏ.
                 */
                if (subaction.equals(PluginConst.LOGIN)) {
                    return login(req);
                }

                /**
                 * Р’С‹С…РѕРґ РёР· СЃРёСЃС‚РµРјС‹.
                 */
                if (subaction.equals(PluginConst.LOG_OFF)) {
                    return logOff(req);
                }

                /* РЎРїРёСЃРѕРє РґРµР№СЃС‚РІРёР№ РєРѕС‚РѕСЂС‹Рµ РјРѕРіСѓС‚ РІС‹РїРѕР»РЅРёС‚СЊСЃСЏ. */

                req.setAttribute(PluginConst.ERROR_MESSAGE,
                        "Р”РµР№СЃС‚РІРёСЏ РґР»СЏ РґР°РЅРЅРѕРіРѕ С‚РёРїР° РїРѕРґРґРµР№СЃС‚РІРёСЏ РЅРµ РЅР°Р№РґРµРЅРѕ. РўРёРї РїРѕРґРґРµР№СЃС‚РІРёСЏ = " + subaction);
            } catch (DAOException ex) {
                logger.debug("Error due access to database. "
                        + "Plugin = PropertyGroupPluginBean. "
                        + "Subaction=" + subaction, ex);
                req.setAttribute(PluginConst.ERROR_MESSAGE,
                        "РћС€РёР±РєР° РґРѕСЃС‚СѓРїР° Рє РґР°РЅРЅС‹Рј. " + ex.getMessage());
            } catch (WrongPageRequest ex) {
                req.setAttribute(PluginConst.ERROR_MESSAGE,
                        "Р”Р°РЅРЅС‹Рµ РёР· СЂРµРєРІРµСЃС‚Р° РѕС€РёР±РѕС‡РЅС‹ :\n" + ex.getMessage());
            } finally {
                if (oracleDAOFactory != null) {
                    try {
                        oracleDAOFactory.cleanUp();
                    } catch (DAOException ex) {
                        logger.debug("Error due access to database. "
                                + "Plugin = PropertyGroupPluginBean. "
                                + "Subaction=" + subaction, ex);
                        req.setAttribute(PluginConst.ERROR_MESSAGE,
                                "РћС€РёР±РєР° РґРѕСЃС‚СѓРїР° Рє РґР°РЅРЅС‹Рј. " + ex.getMessage());
                    }
                }
            }
        } else {
            req.setAttribute(PluginConst.ERROR_MESSAGE,
                    "РўРёРї РїРѕРґРґРµР№СЃС‚РІРёСЏ РЅРµ Р·Р°РґР°РЅ.");
        }
        return new PluginRouter("/errorpage.jsp");
    }

    /**
     * РњРµС‚РѕРґ, РІС‹РґР°СЋС‰РёР№ СЃС‚СЂР°РЅРёС†Сѓ Р°РІС‚РѕСЂРёР·Р°С†РёРё.
     * @param req Р РµРєРІРµСЃС‚.
     * @return PluginRouter РЅР° СЃС‚СЂР°РЅРёС†Сѓ РІ РєРѕС‚РѕСЂРѕР№ Р±СѓРґРµС‚ РїСЂРѕРёР·РІРѕРґРёС‚СЊСЃСЏ РґРёР°Р»РѕРі Р°РІС‚РѕСЂРёР·Р°С†РёРё.
     * @throws DAOException РћС€РёР±РєРё РґРѕСЃС‚СѓРїР° Рє Р±Р°Р·Рµ РґР°РЅРЅС‹С….
     */
    private PluginRouter getAuthrizationPage(HttpServletRequest req) throws DAOException, WrongPageRequest {
        return new PluginRouter("/Authorization.jsp");
    }

    /**
     * РњРµС‚РѕРґ, РєРѕС‚РѕСЂС‹Р№ РїРѕР·РІРѕР»СЏРµС‚
     * Р·Р°Р»РѕРіРёРЅРёС‚СЊСЃСЏ РїРѕР»СЊР·РѕРІР°С‚РµР»СЋ.
     * @param req Р РµРєРІРµСЃС‚.
     * @return PluginRouter c Р·Р°РїСЂР°С€РёРІР°РµРјРѕР№ СЃС‚СЂР°РЅРёС†РµР№.
     * @throws DAOException РћС€РёР±РєР° РґРѕСЃС‚СѓРїР° Рє Р±Р°Р·Рµ РґР°РЅРЅС‹С….
     * @throws WrongPageRequest РљСЂРёС‚РёС‡РµСЃРєР°СЏ РѕС€РёР±РєР° РІ РґР°РЅРЅС‹С… СЂРµРєРІРµСЃС‚Р°.
     */
    private PluginRouter login(HttpServletRequest req) throws DAOException, WrongPageRequest {
        String name = req.getParameter(PluginConst.USER_NAME);
        String password = req.getParameter(PluginConst.USER_PASSWORD);
        String error_message = "";
        if ((name == null) || (name.equals(""))) {
            error_message = error_message + "Р�РјСЏ РїРѕР»СЊР·РѕРІР°С‚РµР»СЏ РЅРµ РґРѕР»Р¶РЅРѕ Р±С‹С‚СЊ РїСѓСЃС‚С‹Рј!";
        }
        if ((password == null) || (password.equals(""))) {
            error_message = error_message + "РџР°СЂРѕР»СЊ РЅРµ РґРѕР»Р¶РЅРѕ Р±С‹С‚СЊ РїСѓСЃС‚С‹Рј.";
        }

        if (error_message.equals("")) {
            User user = oracleDAOFactory.getUserDAO().getByNameAndPassword(name, password);
            if (user != null) {
                HttpSession session = req.getSession();
                session.setAttribute(PluginConst.CURRENT_USER, user);
                return new PluginRouter("/index.jsp");
            } else {
                error_message = "Р›РѕРіРёРЅ РёР»Рё РїР°СЂРѕР»СЊ РЅРµ РІРµСЂРЅС‹.";
                if (name != null) {
                    req.setAttribute(PluginConst.USER_NAME, name);
                }
            }
        }
        req.setAttribute(PluginConst.ERROR_MESSAGE, error_message);
        return getAuthrizationPage(req);
    }

    /**
     * РњРµС‚РѕРґ, РІС‹РґР°СЋС‰РёР№ СЃС‚СЂР°РЅРёС†Сѓ Р°РІС‚РѕСЂРёР·Р°С†РёРё.
     * @param req Р РµРєРІРµСЃС‚.
     * @return PluginRouter РЅР° СЃС‚СЂР°РЅРёС†Сѓ РІ РєРѕС‚РѕСЂРѕР№ Р±СѓРґРµС‚ РїСЂРѕРёР·РІРѕРґРёС‚СЊСЃСЏ РґРёР°Р»РѕРі Р°РІС‚РѕСЂРёР·Р°С†РёРё.
     * @throws DAOException РћС€РёР±РєРё РґРѕСЃС‚СѓРїР° Рє Р±Р°Р·Рµ РґР°РЅРЅС‹С….
     */
    private PluginRouter logOff(HttpServletRequest req) throws DAOException, WrongPageRequest {
        HttpSession session = req.getSession();
        session.setAttribute(PluginConst.CURRENT_USER, null);
        return new PluginRouter("/Authorization.jsp");
    }
}
